home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 1 / Gold Medal Software Volume 1 (Gold Medal) (1994).iso / graphics / tierra40.arj / TIERRA / ARG.C < prev    next >
C/C++ Source or Header  |  1992-09-09  |  9KB  |  279 lines

  1. /*-------------------------------------------------------------------------*/
  2. /* arg.c: 9-9-92 genebank archive utility, by T Uffner, D Pirone, & T Ray */
  3. /* Tierra Simulator V4.0: Copyright (c) 1991, 1992 Tom Ray & Virtual Life */
  4. /*-------------------------------------------------------------------------*/
  5.  
  6. #ifndef lint
  7. static char sccsid[] = "@(#)arg.c    1.5     7/21/92";
  8. #endif
  9.  
  10. #include "license.h"
  11. #include "tierra.h"
  12. #include "declare.h"
  13. #include "arginst.h"
  14. #include <errno.h>
  15.  
  16. #ifdef __TRS6000__
  17. void *malloc();
  18. #else
  19. #ifdef unix
  20. char *malloc();
  21. #endif
  22. #endif
  23.  
  24. int  hangup = 0;
  25.  
  26. int main(argc, argv)
  27.     int   argc;
  28.     char  *argv[];
  29. {
  30.     I8s  com, *mod, *u = "usage:  arg c|r[v12] afile size file [file...]\
  31.         \n\targ x[v12] afile [genotype [genotype...]]\n\targ t[v] afile\n";
  32.     I8s  *file = 0, m[20],data[85];
  33.     I32s i, v = 0, f = GFormat, size = 0;
  34.     FILE *afp = 0;
  35. #ifdef __TURBOC__
  36.     float  z = sin(0);
  37. #endif
  38.  
  39.     GList *g = 0;
  40.     head_t head;
  41.     indx_t *indx, *tindx, gindx;
  42.  
  43.     if (argc < 3)
  44.     {   fprintf(stderr, u);
  45.         exit(1);
  46.     }
  47.     GetAMap("opcode.map");
  48.     switch (com = *argv[1])
  49.     {   case 'c':
  50.         case 'r':
  51.         if (argc < 5)
  52.         {   fprintf(stderr, u);
  53.             exit(2);
  54.         }
  55.         if (!sscanf(argv[3], "%ld", &size))
  56.         {   fprintf(stderr, u);
  57.             exit(3);
  58.         }
  59.         case 't':
  60.         case 'x':
  61.             break;
  62.         default:
  63.             fprintf(stderr, u);
  64.         exit(4);
  65.     }
  66.     for (mod = ++argv[1]; *mod; mod++)
  67.         switch (*mod)
  68.         {   case 'v':
  69.                 ++v;
  70.                 break;
  71.             case '1':
  72.             case '2':
  73.             case '3':
  74.             case '4':
  75.             case '5':
  76.             case '6':
  77.             case '7':
  78.             case '8':
  79.             case '9':
  80.                 f = *mod - '0';
  81.                 break;
  82.             default:
  83.                 fprintf(stderr, u);
  84.             exit(5);
  85.         }
  86.     file = argv[2];
  87.  
  88.     switch (com)
  89.     {   case 'c':
  90.             fprintf(stdout, "creating archive \"%s\"\n", file);
  91.             g = (GList *) calloc(1, sizeof(GList));
  92.             GetAscGen(g,argv[4]);
  93.             f = GFormat;
  94.         case 'r':
  95.             if (!(afp = open_ar(file, size, f , com == 'c' ? 1 : 0)))
  96.             {   perror(argv[0]);
  97.                 exit(6);
  98.             }
  99.             head = read_head(afp);
  100. #ifdef __TURBOC__
  101.             indx = &gindx;
  102. #else  /* __TURBOC__ */
  103.             indx = read_indx(afp, &head);
  104. #endif /* __TURBOC__ */
  105.             if (g)
  106.             {   free(g);
  107.                 g = NULL;
  108.             }
  109.             g = (GList *) calloc(1, sizeof(GList));
  110.             for (i=4; i < argc; i++)
  111.             {   int j;
  112.                 GetAscGen(g, argv[i]);
  113.                 if (head.size != g->gen.size)
  114.                 {   fprintf(stderr, "%s is wrong size\n", g->gen.label);
  115.                     continue;
  116.                 }
  117.                 j = add_gen(afp, &head, &indx, g);
  118.                 if (v)
  119.                 {   fprintf(stdout, "%c - %04ld%3s %.3f %.3f", j?'r':'a',
  120.                         size, g->gen.label, g->MaxPropPop, g->MaxPropInst);
  121.                     if (IsBit(g->bits,0))
  122.                     {   WritEcoB(g->bits, mes[9]);
  123.                         fprintf(stdout," 1 %s\n",mes[9]);
  124.                     }
  125.                     else fprintf(stdout," 0\n");
  126.                 }
  127.                 else fprintf(stdout, "%c - %3s\n", j?'r':'a', g->gen.label);
  128.             }
  129.             if (g)
  130.             {   free(g);
  131.                 g = NULL;
  132.             }
  133.             fclose(afp);
  134.             break;
  135.         case 't':
  136.             if (!(afp = fopen(file, "rb")))
  137.             {   perror(argv[0]);
  138.                 exit(7);
  139.             }
  140.             head = read_head(afp);
  141.             if (strncmp(head.magic, "tie", 3) 
  142.                 || (f > -1 && head.magic[3] - '0' != f))
  143.             {   fprintf(stderr, "%s: bad magic number", *argv);
  144.                 exit(8);
  145.             }
  146. #ifdef __TURBOC__
  147.             indx = &gindx;
  148. #else  /* __TURBOC__ */
  149.             indx = read_indx(afp, &head);
  150. #endif /* __TURBOC__ */
  151.             sprintf(m, "%4s",head.magic);
  152.             m[4]='\0';  /* insanity for not having null in the struct */
  153.             fprintf(stdout, "Format: %s, Size: %hd, # of entries: %hd\n\n",
  154.                 m, head.size, head.n);
  155.             for (i = 0; i < head.n; i++)
  156.             {
  157. #ifdef __TURBOC__
  158.                 find_gen(afp, indx, "---", i);
  159.                 tindx = indx;
  160. #else  /* __TURBOC__ */
  161.                 tindx = &indx[i];
  162. #endif /* __TURBOC__ */
  163.                 if (v)
  164.                 {   g = get_gen(afp, &head, tindx, i);
  165.                     sprintf(m,"%3s",tindx->gen);
  166.                     fprintf(stdout, "%04hd%.3s %.3f %.3f", head.size,
  167.                         m, tindx->mpp / 10000., tindx->mpi / 10000.);
  168.                     if (IsBit(tindx->bits, 0))
  169.                     {   WritEcoB(tindx->bits, mes[9]);
  170.                         fprintf(stdout," 1 %s\n",mes[9]);
  171.                     }
  172.                     else fprintf(stdout," 0\n");
  173.                 }
  174.                 else fprintf(stdout, "%.3s\n", tindx->gen);
  175.             }
  176.             break;
  177.         case 'x':
  178.             if (!(afp = fopen(file, "rb")))
  179.             {   perror(argv[0]);
  180.                 exit(9);
  181.             }
  182.             head = read_head(afp);
  183.             if (strncmp(head.magic, "tie", 3) 
  184.                 || (f > -1 && head.magic[3] - '0' != f))
  185.             {   fprintf(stderr, "%s: bad magic number", *argv);
  186.                 exit(10);
  187.             }
  188. #ifdef __TURBOC__
  189.             indx = &gindx;
  190. #else  /* __TURBOC__ */
  191.             indx = read_indx(afp, &head);
  192. #endif /* __TURBOC__ */
  193.             if (argc > 3)
  194.                 for (i=3; i<argc; i++)
  195.                 {   int j;
  196.                     if ((j = find_gen(afp, indx, argv[i], head.n)) == head.n)
  197.                     {   fprintf(stderr, "%s not in archive\n", argv[i]);
  198.                         continue;
  199.                     }
  200. #ifdef __TURBOC__
  201.                     tindx = indx;
  202. #else  /* __TURBOC__ */
  203.                     tindx = &indx[j];
  204. #endif /* __TURBOC__ */
  205.                     g = get_gen(afp, &head, tindx, j);
  206.                     file = malloc(8);
  207.                     sprintf(file, "%04hd%3s", head.size, g->gen.label);
  208.                     WritAscFile(g, file);
  209.                     if (v)
  210.                     {   fprintf(stdout, "x - %04ld%3s %.3f %.3f", g->gen.size,
  211.                             g->gen.label, g->MaxPropPop, g->MaxPropInst);
  212.                         if (IsBit(g->bits,0))
  213.                         {   WritEcoB(g->bits, mes[9]);
  214.                             fprintf(stdout," 1 %s\n",mes[9]);
  215.                         }
  216.                         else fprintf(stdout," 0\n");
  217.                     }
  218.                     else fprintf(stdout, "x - %3s\n", g->gen.label);
  219.                     if (file)
  220.                     {   free(file);
  221.                         file = NULL;
  222.                     }
  223.                     if (g)
  224.                     {   if (g->genome)
  225.                         {   free(g->genome);
  226.                             g->genome = NULL;
  227.                         }
  228.                         if (g->gbits)
  229.                         {   free(g->gbits);
  230.                             g->gbits = NULL;
  231.                         }
  232.                         free(g);
  233.                         g = NULL;
  234.                     }
  235.                 }
  236.             else
  237.                 for (i=0; i<head.n; i++)
  238.                 {
  239. #ifdef __TURBOC__
  240.                     find_gen(afp, indx, "---", i);
  241.                     tindx = indx;
  242. #else  /* __TURBOC__ */
  243.                     tindx = &indx[i];
  244. #endif /* __TURBOC__ */
  245.                     g = get_gen(afp, &head, tindx, i);
  246.                     file = malloc(12);
  247.                     sprintf(file, "%04hd%3s", head.size, g->gen.label);
  248.                     WritAscFile(g, file);
  249.                     if (v)
  250.                     {   fprintf(stdout, "x - %04ld%3s %.3f %.3f", g->gen.size,
  251.                             g->gen.label, g->MaxPropPop, g->MaxPropInst);
  252.                         if (IsBit(g->bits,0))
  253.                         {   WritEcoB(g->bits, mes[9]);
  254.                             fprintf(stdout," 1 %s\n",mes[9]);
  255.                         }
  256.                         else fprintf(stdout," 0\n");
  257.                     }
  258.                     else fprintf(stdout, "x - %3s\n", g->gen.label);
  259.                     if (file)
  260.                     {   free(file);
  261.                         file = NULL;
  262.                     }
  263.                     if (g)
  264.                     {   if (g->genome)
  265.                         {   free(g->genome);
  266.                             g->genome = NULL;
  267.                         }
  268.                         if (g->gbits)
  269.                         {   free(g->gbits);
  270.                             g->gbits = NULL;
  271.                         }
  272.                         free(g);
  273.                         g = NULL;
  274.                     }
  275.                 }
  276.             break;
  277.     }
  278. }
  279.